package tech.xs.common.auth.domain.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import tech.xs.common.framework.domain.enums.BaseEnum;

import java.util.HashMap;
import java.util.Map;

public enum AuthClientTypeEnum implements BaseEnum {

    /**
     * 0 未知
     * access token 有效时: 2小时
     * access token 刷新时间间隔: 1小时
     * refresh token 有效时长: 30天
     */
    UNKNOWN(0, 7200000L, 3600000L, 2592000000L),

    /**
     * 浏览器
     * access token 有效时: 2小时
     * access token 刷新时间间隔: 1小时
     * refresh token 有效时长: 30天
     */
    BROWSER(1, 7200000L, 3600000L, 2592000000L),

    /**
     * App
     * access token 有效时长: 15天
     * access token 刷新时间间隔: 7天
     * refresh token 有效时长: 60天
     */
    APP(2, 1296000000L, 604800000L, 5184000000L),

    /**
     * 服务端
     * access token 有效时长: 永久
     * access token 刷新时间间隔: 0
     * refresh token 有效时长: 永久
     */
    SERVER(3, Long.MAX_VALUE, 0L, Long.MAX_VALUE),

    /**
     * 第三方工具
     * access token 有效时长: 永久
     * access token 刷新时间间隔: 0
     * refresh token 有效时长: 永久
     */
    TOOL(4, Long.MAX_VALUE, 0L, Long.MAX_VALUE);


    @EnumValue
    @JsonValue
    private final int value;

    /**
     * access token 有效时长(毫秒)
     */
    @Getter
    private final long accessTokenValidity;

    /**
     * 刷新时间间隔(毫秒)
     */
    @Getter
    private final long accessTokenRefreshInterval;

    /**
     * refresh token 有效时长(毫秒)
     */
    @Getter
    private final long refreshTokenValidity;

    private static final Map<Integer, AuthClientTypeEnum> mappings = new HashMap<>(values().length);

    static {
        for (AuthClientTypeEnum item : values()) {
            mappings.put(item.getValue(), item);
        }
    }

    AuthClientTypeEnum(int value, long accessTokenValidity, long accessTokenRefreshInterval, long refreshTokenValidity) {
        this.value = value;
        this.accessTokenValidity = accessTokenValidity;
        this.accessTokenRefreshInterval = accessTokenRefreshInterval;
        this.refreshTokenValidity = refreshTokenValidity;
    }

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static AuthClientTypeEnum create(int value) {
        return mappings.get(value);
    }

    @Override
    public Integer getValue() {
        return value;
    }
}
